package savet.gui.util;

import java.awt.event.ActionEvent;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.Icon;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import savet.entidades.Trabalhador;
import savet.entidades.atributos.Ferias;
import savet.entidades.atributos.Periodo;
import savet.gui.dialogos.DialogoListaPeriodos;
import savet.util.ListaTrabalhadores;

/**
 * Item de menu para {@link JPopupMenu} e {@link Ferias}.
 *
 * @author Adisson Marinho
 */
public abstract class PopupPeriodosItem extends JMenuItem {


    private AbstractAction action;

    // Gui Components and related
    protected JTable table;
    protected int column;
    protected int row;

    public PopupPeriodosItem(String name, Icon icon) {
        action = createDefaultAction(name, icon);
        this.setAction(action);
    }

    public PopupPeriodosItem(String name) {
        this(name, null);
    }

    /**
     * Cria a action padrao para o {@link JMenuItem}.
     *
     * @param name nome e titulo da action
     * @param icon icone da action
     * @return {@link AbstractAction}
     *
     * @see FeriasItem
     */
    protected AbstractAction createDefaultAction(String name, Icon icon)
    {
        return new AbstractAction(name, icon) {

            /**
             * Action como Template Method
             */
            public void actionPerformed(ActionEvent e) {
                System.out.println("ActionListener in " + e.getSource());
                
                // metodo de abstracao
                efetuarOperacao(ListaTrabalhadores.getInstance().getTrabalhador(row));
                
                if (table != null) {
                    AbstractTableModel model = (AbstractTableModel) table.getModel();
                    model.fireTableRowsUpdated(row, row);
                    table = null;
                }


            }
        };
    }

    /**
     * Efetua alguma operacao com o {@link Trabalhador}, podendo obter seus atributos
     * nas implementacoes.
     *
     * @param trabalhador
     */
    protected abstract void efetuarOperacao(Trabalhador trabalhador);

    protected void criarDialogoPeriodos(List<Periodo> periodos) {
        DialogoListaPeriodos d = new DialogoListaPeriodos(null, true, periodos);
        d.setVisible(true);
    }

    public void setRowToUpdate(JTable table, int row) {
        this.table = table;
        this.row = row;
    }
}
